{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Meta-Learner Benchmarks with Semi-synthetic Data in Schuler, A., Jung, K., Tibshirani, R., Hastie, T., and Shah, N. Synth-validation: Selecting the best causal inference method for a given dataset (2017)\n",
    "\n",
    "This notebook compares X-, R-, and T learners using the Constrained gradient boosting semi synthetic framework described in  [Schuler, A., Jung, K., Tibshirani, R., Hastie, T., and Shah, N (2017)](https://arxiv.org/pdf/1711.00083) using the IHDP dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/iyarlin/.pyenv/versions/3.11.6/lib/python3.11/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n",
      "Failed to import duecredit due to No module named 'duecredit'\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "from causalml.inference.meta import BaseTRegressor\n",
    "from causalml.inference.meta import BaseXRegressor\n",
    "from causalml.inference.meta import BaseRRegressor\n",
    "\n",
    "from causalml.dataset.semiSynthetic import SemiSynthDataGenerator\n",
    "\n",
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.base import clone\n",
    "\n",
    "from sklearn.linear_model import LogisticRegression, Lasso\n",
    "\n",
    "from copy import deepcopy\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "sns.set_style('whitegrid')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.15.5\n"
     ]
    }
   ],
   "source": [
    "import importlib\n",
    "print(importlib.metadata.version('causalml') )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.read_csv('data/ihdp_npci_8.csv', header=None)\n",
    "cols =  [\"treatment\", \"y_factual\", \"y_cfactual\", \"mu0\", \"mu1\"] + [str(i) for i in range(25)]\n",
    "data.columns = cols\n",
    "\n",
    "X = data[[str(i) for i in range(5)]]\n",
    "y = data[\"y_factual\"]\n",
    "w = data[\"treatment\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "class NaiveLearner():\n",
    "    def _init_(self):\n",
    "        pass\n",
    "    def fit(self, X, treatment, y):\n",
    "        self.ate = y[treatment==1].mean() - y[treatment==0].mean()\n",
    "    def predict(self, X, p):\n",
    "        return np.repeat(self.ate, len(X))  \n",
    "    def estimate_ate(self, X, treatment, y):\n",
    "        ate = y[treatment==1].mean() - y[treatment==0].mean()\n",
    "        return [ate] # No need for CI right now"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def run_experiments(X, w, y, learner_dict, propensity_learner, K=10, n=None, **data_generator_kwargs):\n",
    "    \n",
    "    synth_gen = SemiSynthDataGenerator(**data_generator_kwargs)\n",
    "    synth_gen.fit(X, w, y)   \n",
    "    datasets = synth_gen.generate(K=K, n=n)\n",
    "    result_list = []\n",
    "\n",
    "    for q in range(len(datasets)):\n",
    "        for k in range(len(datasets[q])):\n",
    "            X = datasets[q][k][[str(i) for i in range(5)]]\n",
    "            w = datasets[q][k]['w']\n",
    "            y = datasets[q][k]['y']\n",
    "            tau_i = datasets[q][k]['tau_i']\n",
    "            X_train, X_test, w_train, _, y_train, _, _, tau_test = train_test_split(\n",
    "                X, w, y, tau_i, test_size=0.2, random_state=111)\n",
    "\n",
    "            em = clone(propensity_learner)\n",
    "            em.fit(X_train, w_train)\n",
    "            e_hat_test = em.predict_proba(X_test)[:, 1]\n",
    "            \n",
    "            for learner in learner_dict.keys():\n",
    "                model = deepcopy(learner_dict[learner])\n",
    "                model.fit(X = X_train, treatment = w_train, y = y_train)\n",
    "                hat_tau = model.predict(X_test, p=e_hat_test)\n",
    "                pehe = mean_squared_error(tau_test, hat_tau)\n",
    "                result_list.append([q, k, learner, pehe])\n",
    "    \n",
    "    cols = ['q', 'k', 'learner', 'pehe']\n",
    "    df_res = pd.DataFrame(result_list, columns=cols)\n",
    "    return df_res"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lasso based experiments"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n"
     ]
    }
   ],
   "source": [
    "learner_dict = {\n",
    "    'Naive-Learner': NaiveLearner(),\n",
    "    'T-Learner': BaseTRegressor(learner=Lasso()),\n",
    "    'X-Learner': BaseXRegressor(learner=Lasso()),\n",
    "    'R-Learner': BaseRRegressor(learner=Lasso())\n",
    "}\n",
    "\n",
    "propensity_learner = LogisticRegression(penalty='l1', solver='liblinear')\n",
    "df_res_lasso = run_experiments(X, w, y, learner_dict, propensity_learner, Q = 5, B=1, n = 10000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnoAAAHMCAYAAABC0QX5AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAUr1JREFUeJzt3Xl8DWf///H3ySYhxL5LKU6oWKqWUrS2Vi2hqqoqKLXdxd3bru4WJVWlK12ocldajSK22JfSopbaqlq71B57SIQkMr8//HK+0pzEyXqS8Xo+Hh5pZ+aa+cw5k3PemZnrGothGIYAAABgOi7OLgAAAABZg6AHAABgUgQ9AAAAkyLoAQAAmBRBDwAAwKQIegAAACZF0AMAADApgh4AAIBJEfQAwGTu3r3r7BIA5BAEPSADpkyZIj8/P/n5+al3794PXH7UqFHy8/PTU089lWR6aGiobT3Hjx/PqnIfGmfOnLG9nj/88IOzy8k2cXFxmjVrliZNmuS0GhYvXiw/Pz/NmjXLNm3Hjh229yM0NNRpteUGAwcOVPXq1XX48GFnlwKTIOgB6RQfH6+lS5fa/n/r1q06deqUEyvCw6579+6aMmWKoqKinLL906dPa8KECfL19VX37t2dUkNuN3LkSEnSsGHDFBsb6+RqYAYEPSCdNm3apEuXLqlgwYIqX768DMNQSEiIs8uCJHd3d/n6+srX11f58+d3djnZJiIiwqnbnzBhgqKjozV06FB5eHg4tZbcqly5curWrZuOHDmir7/+2tnlwAQIekA6LVq0SJJUu3ZttWzZUtK9S7D8Fe58JUqU0Lp167Ru3Tq1bdvW2eU8FDZu3KjNmzfrscceU6tWrZxdTq7Wp08f5c2bVzNmzND58+edXQ5yOYIekA6XLl3Szz//LElq0qSJWrduLUm6du2aVq1a5czSgGxnGIY+/fRTSVKPHj2cXE3uV7hwYbVr10537tzRl19+6exykMu5ObsAIDdasmSJ4uPj5eLiopYtW6po0aKqXLmyjh49qh9++EHt27fP9pq2bt2qH3/8UXv37tXVq1eVL18+Wa1WBQQE6IUXXpCbW9Jf98GDB2vNmjWSpMmTJ6tDhw7J1jlt2jRNnz5dkvTf//5XgYGBkqTAwEDt3LlT3bt318iRIzV79mwtXbpUZ86cUYECBeTn56fAwEA9/fTTqdb8+++/6/vvv9euXbt06dIleXp66tFHH9Vzzz2nrl27ytPTM1mbUaNGafHixWrdurVGjBihsWPHaufOnXJzc9Ojjz6qqVOnysXFRc2bN5ckjRs3Tq+88oqtfbNmzXT27FlNnDhRbdu21ezZs7Vy5UqdOXNGefPmlb+/v/r166c6depIko4fP66ZM2dq27ZtunbtmooVK6ZnnnlGgwYNUuHChe3uV3x8vBYvXqywsDAdPnxYUVFRKliwoGrXrq2XX345WWecRH5+fpKkr7/+Wk888YTmzJmjNWvW6MyZM3JxcVHlypUVEBCgzp07J3k/E1+TRIsXL7b9/4YNG1S2bFlJUmRkpL7//ntt3LhRx48fV1xcnAoWLCh/f3+1atVK7dq1k6ura6rvmT0///yzDh06pPz582fp2bytW7dq+fLl2rt3ry5fvqw7d+4of/78qlSpkpo3b66XX35ZXl5eydol3k+7YsUKHTx4UNHR0fL29laFChXUtGlTde3aVd7e3pnWTpISEhK0Zs0aLVmyRH/88YciIyPl7e2tKlWqqE2bNnZ/J+/XuXNnzZ8/X6GhoRo8eLCKFi2a/hcODzWCHpAOiZdtGzRoYPsA7tChg6ZMmaK9e/fq0KFDqlKlSrbUEhsbqzFjxmjZsmVJpl+/fl07d+7Uzp07FRISoq+++krFihWzzR83bpx+++03XblyRe+//76aNGmSJLgcOHBAX331laR7Zy0TQ9797t69q379+mnLli22abdv39bFixf1yy+/6OWXX9a4cePk4pL04oFhGJo6daq++eYbGYaRZF/27dunffv26YcfftCMGTP06KOP2t3vGzduqHv37kk6wJw/f15lypRx6HLX1atX1alTJx07dixJ7T///LO2bdumL774QvHx8RoyZIhu375tW+bcuXOaN2+etm3bpkWLFiX7oo+IiFD//v31559/Jpl+6dIlrVmzRmvWrFHHjh317rvvyt3d3W5tERERat++vU6fPp1k+t69e7V3716tXbtWs2bNSjUo/NOZM2cUGBioc+fOJavrp59+0k8//aRFixZp5syZdsNSahJ7Nj/99NN2w3lGxcTEaMiQIdq4cWOyeVevXrUd56GhoZo3b16S9yQ2Nlb9+vXTtm3bkrS7du2arl27pj179ui7777T3LlzVb58+Qy3S1xm8ODB2rlzZ7Lpv/76q3799VfN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+nX99ddfGj9+vO2+xPLly6tbt26Zuv2CBQtKkq1n6rVr1xQfH69atWrZzqR+9tlnCgoK0sGDB3X16lX9/fffWrBggW1MwxIlSujZZ591eJuJPadv3bplu1Sfml27dmnBggUP/Hfx4kVJ//e0jYSEBPXr10+//vqrrly5orNnz2rlypV65ZVXkoTq++998/DwUPfu3SXdC9/9+/fXjh07dPHiRV24cEGbNm1Sz549dfPmTbm6uqpr164Zaifd+71PHB5n6tSpGjNmjO1Zt8eOHdOUKVNsv4ePPPKIhgwZkuJrdfDgQUn3zt472kMd+Cc6YwAPsGTJEtuApo5ctk3UsGFD27MqN2/e7NDzV9PKYrFo6tSpGj58uDZs2KBNmzbZvdTk7e2tjz76yPYILenewMWJZxp79+6dbMy4wMBAhYWF6cCBA/rss8/0zDPPJLvEVLFiRXl6eiosLCzZGSwXFxeNGjXKdu/X/UaNGqW4uDiFhIRo79696tu3b7JlPDw8NG7cONvAsrlBwYIFNXv2bA0YMEAnTpzQ//73v2SP5JKkChUq6Ouvv35gz8y0atiwofbt26eIiAjbZc7vv/9ederU0ZQpU9SzZ0+Fh4dr7ty5tkGx71e0aFHNmDEjTT2a69Spozx58ujOnTvatWtXis8mThQaGqrQ0NAHrnfu3LkqXry4OnXqZHuM3MGDB9WzZ89ky5YqVUpNmjTR/PnzFRMTo4iICJUoUUKS1L9/f/3111/auHGjNm/erM2bNydr7+HhofHjxyf5HUhvOw8PD3311VcaOHCgdu/erYULF9rtyFWjRg198sknqfZWThwns3r16rYQD6QVQQ94gMTOFAUKFLBdjnWEi4uLOnbsqGnTpunu3bspPgUho/Lly6cvvvhCmzdv1qJFi7R//35duXJFbm5uKleunJo0aaLu3bvbvvike5eEJk+eLOnemaU33ngj2XpdXV01ceJEvfjii4qLi9PIkSP1448/JrnM5O3treDgYH399ddavny5zp07p+LFi6tu3brq2bNnigMau7m5afz48Wrfvr1CQkL022+/2e6BLF26tBo2bKju3bsne1h8blC+fHktXbpUixYt0po1a3T48GHduHFDefPmVeXKlfXcc8+pS5cuGR4exp4BAwYoNjZWK1as0OXLl1WgQAHbvXOlSpXSkiVLNG/ePK1fv17H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FPT69u2rsLAwnTt3TmvXrtXp06fVvn17tWvXToULF87qGgEAAJAODnXGGDJkiDZu3Ki5c+eqY8eOOn36tCZNmqQmTZqof//+WrVqlWJjY7O6VgAAAKRBmi7d1qtXT/Xq1dPYsWO1fv16LVu2TFu2bNHmzZvl7e2tVq1aKSAgQHXr1s2qegEAAOCgdI2j5+HhodatW6t169a6du2aVqxYoWXLlmnBggVauHChSpcurYCAALVv317ly5fP5JIBAADgiAyPo1eoUCF169ZNP/74o1avXq0BAwbIzc1NX331lZ5//nkGUAYAAHCSTB0wuXz58urfv7+GDRumihUryjAM/f7775m5CQAAADgoUx6BZhiGtm3bprCwMK1bt07R0dEyDENFihTR888/n+H179+/X6+88opmzZqlhg0bOtRm8eLF+vbbbxUeHi5vb2+1bNlSb775pnx8fDJcDwAAQG6QoaC3f/9+LV++XKtXr9aVK1dkGIa8vLzUpk0bBQQE6KmnnpKrq2uGCgwPD9cbb7yhu3fvOtxmxowZ+uijj9SgQQMNHz5cZ86cUXBwsPbs2aP58+fL09MzQzUBAADkBmkOesePH9fy5cu1YsUKnTlzRoZhyNXVVU899ZQCAgLUsmVLeXl5ZUpx69at05gxYxQZGelwm/Pnz2vatGlq3LixZs6cKReXe1enq1SpohEjRig4OFh9+vTJlPoAAAByMoeC3oULFxQWFqawsDAdPnzY9hi06tWrq127dmrTpo2KFCmSqYX17dtXmzdvVqVKldS4cWOFhYU51C4sLExxcXHq3r27LeRJUkBAgD788EOFhoYS9AAAwEPBoaDXtGlTSffuxfP19VW7du0UEBCgRx55JMsKO3HihIYMGaLXXntNM2bMcLjd/v37JUm1atVKMt1isahGjRpat26dbt68qfz582dmuQAAADmOQ0HPMAxZLBb5+PiobNmy2rt3r/bu3evQBiwWi7755ps0F7Zy5Up5eHikud2FCxeUN29eFShQINm8kiVLSpLOnj2rKlWqpHndAAAAuYnD9+gZhqHIyEht27YtTRuwWCxpLkpSukKeJN28eVP58uWzOy+xE8atW7ceuJ6YmBjFxcU5tM3bt287XiBypNu3bzt0XADZhc+V3C+7Plc4VszBkeMlPj4+zet1KOhNmjQpzSvOiRLvLbz/3r2UHD16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dJtBEydOVLt27TR58mQ1atRIpUuXtrvcvn371K1bN5UuXVrdunVToUKFdObMGYWEhOg///mP8ufPr8aNGydrV6VKFVWrVk1r167VuHHjlCdPHtu8FStWKC4uTi+++KIkKTIyUl26dNG5c+f00ksvqVKlSvr7778VEhKin376SfPnz9cjjzySqfs/dOhQrVy5Us8995w6d+6syMhIhYaGKjAwUB999JFatWolSTp9+rQ6deokT09PdenSRSVKlNDFixe1cOFCvfvuu3J1dVWXLl1s642Pj9ewYcPUrVs3FSxYUCVLlrTNCwkJUXR0tLp27apSpUppzZo1+v7773Xjxg1NnTrVttyUKVM0a9YsPfXUUxoyZIju3LmjFStWaMCAARo9erR69uyZZF/Gjh2rli1bqlOnToqKipKXl1emvla5TWxsrHr16qV9+/apffv26tmzpyIiIhQSEqLOnTtr9uzZql27tqS0H9/nz5/XBx98YOvQVKtWLduDuT/55BMZhqGXX35ZPj4+Cg0N1VdffSVJ+s9//mNbh6PHXqJhw4bpxRdf1Kuvvip3d/csfe1ygnLlyuntt9/WqFGj1LlzZ924cUPjxo1Ldvk/s/BZYE4bNmyQJPn7+2fqejlespGBNPvss88Mq9VqbN261TAMwwgJCTGsVqvx2muv2ZbZunWrYbVajc8++8wwDMN44403DH9/f+PChQtJ1rVp0ybDarUa48ePt03r1q2bYbVajbi4OMMwDOO7774zrFarsWLFiiRtO3XqZDRo0MCIjY01DMMwxo4dazz22GPGnj17kix35MgRw9/f33j99dcfuG+nT582rFar0a1btwcuu2LFCsNqtRpff/11kulRUVFGq1atjPr16xu3bt0yDMMw3nvvPcNqtRoHDhxIsuzRo0cNq9Vq9O3b1zZt5MiRhtVqNT755BO7tfn7+xunTp2yTb97967RokULo1q1arbt7d+/37Barca4ceOSrCM2NtYIDAw0qlWrZpw/f94wDMNYtGiRYbVajVdfffWB+5zTNG3a1LBarQ4vv337dsNqtRojR4584LIzZ840rFarsXLlyiTTL168aNSvX99o3bq1bVp6ju8FCxbYra1BgwbG9evXbdOjoqKMWrVqGY0aNbJNS8uxl/j7Onz48Afusxn16tXLsFqtxksvvZSmdnwWmF/i70ZwcLBx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LVy4UJ07d1abNm3k4eGhZcuW6ffff1fXrl1Vo0aNTN1mbrJ3794U39+mTZuqadOm6tOnj3766Sd9+umn+uuvv/Tkk0/qxo0bCgkJsQ1H4OnpKU9Pz0w5vtMiLcfewyQ+Pl5DhgzRjRs3FBQUpPLlyyeZX7VqVf373//W1KlTNXToUIWEhDxwqBk+Cx5eTz75pAIDAzV37ly99dZb+uabbx54+ZPjJech6GWBl156SatXr07yUPFPPvlEH374obZs2aKVK1eqWLFi8vf31wcffKBx48Zpz549io6OTnUg09KlS9sGaE7shHG/EiVKaNGiRfryyy+1ceNG23Mu69WrpwEDBuixxx5zeB8uXbqk+fPn250XGxurF154Qa6urvrqq6/07bffaunSpZo6daq8vLxUsWJFTZs2Tc8++6ytzTvvvKOCBQtq7dq12rp1qwoXLiyr1aq5c+dq/vz5WrFihU6fPp2kR1RGTZw4UbVq1dL8+fM1bdo0ubq6qnz58po4ceJD//in8PBwhYeH251XrFgxNW3aVPny5dO8efM0c+ZMrV69Wj/99JMKFCigqlWravLkyUl6mmXG8Z0WaTn2HiYff/yx9u3bp+eeey7FY7x37976+eeftXPnTn366acaNmxYquvks+DhNmzYMG3ZskVbt27V999/n2onBYnjJSeyGMb/H6UUAAAApsI9egAAACZF0AMAADApgh4AAIBJEfQAAABMiqAHAABgUgQ9AAAAkyLoAQAAmBRBDwAAwKQIegAAACZF0AMAADApgh4AAIBJEfQAAABMiqAHAABgUv8PeaSf5Jnn1JUAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.boxplot(x='learner', y='pehe', data=df_res_lasso, linewidth=1, showfliers=False)\n",
    "plt.ylabel('PEHE (MSE)')\n",
    "plt.xlabel('')\n",
    "plt.title('All experiments (Lasso)')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The paper discusses benchmarking ATE esimation so let's do that as well:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "def run_experiments2(X, w, y, learner_dict, K=10, n = None, **data_generator_kwargs):\n",
    "    \n",
    "    synth_gen = SemiSynthDataGenerator(**data_generator_kwargs)\n",
    "    synth_gen.fit(X, w, y)   \n",
    "    datasets = synth_gen.generate(K=K, n=n)\n",
    "    result_list = []\n",
    "\n",
    "    for q in range(len(datasets)):\n",
    "        for k in range(len(datasets[q])):\n",
    "            X = datasets[q][k][[str(i) for i in range(5)]]\n",
    "            w = datasets[q][k]['w']\n",
    "            y = datasets[q][k]['y']\n",
    "            tau_i = datasets[q][k]['tau_i']\n",
    "            \n",
    "            X_train, X_test, w_train, _, y_train, _, _, tau_test = train_test_split(\n",
    "                X, w, y, tau_i, test_size=0.2, random_state=111)\n",
    "\n",
    "            true_ate = tau_test.mean()\n",
    "\n",
    "            for learner in learner_dict.keys():\n",
    "                model = deepcopy(learner_dict[learner])\n",
    "                ate_hat = float(model.estimate_ate(X = X_train, treatment = w_train, y = y_train)[0])\n",
    "                ate_diff = np.abs(ate_hat - true_ate)\n",
    "                result_list.append([q, k, learner, ate_diff, true_ate])\n",
    "    \n",
    "    cols = ['q', 'k', 'learner', 'ate_diff', 'true_ate']\n",
    "    df_res = pd.DataFrame(result_list, columns=cols)\n",
    "    return df_res"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n",
      "Failed to import duecredit due to No module named 'duecredit'\n"
     ]
    }
   ],
   "source": [
    "learner_dict = {\n",
    "    'Naive-Learner': NaiveLearner(),\n",
    "    'T-Learner': BaseTRegressor(learner=Lasso()),\n",
    "    'X-Learner': BaseXRegressor(learner=Lasso()),\n",
    "    'R-Learner': BaseRRegressor(learner=Lasso())\n",
    "}\n",
    "\n",
    "df_res_lasso2 = run_experiments2(X, w, y, learner_dict, Q = 5, B=1, n = 10000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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sX//fnz11VeoVauWvnet0MXFxSE5OblQthUbG6v2tTBIpVJUrly50LZHRERUUmkVCrdt24a3b98WWii0srJCWFgY5s+fjx07diAlJQUuLi6YPXs2unfvLi538OBBhIaGYsyYMTqFQolEgj///BOLFi3Cnj17sG3bNlStWhWTJ0+Gv7+/HvfIOBITE+Hn54esrKxC3W5ISEihbcvExATh4eGws7MrtG0SERGVREW222zZsmURHByc5zIBAQEICAjIc5mmTZsiKioq1/k2NjaYNGkSJk2apFOdRZmdnR3CwsIK7UyhMUilUgZCIiIiPSiyoZD0g5dWiYiISBtFsqMJERERERUurc8UKhQKxMXF6bQRnq0iIiIiKtq0DoWHDh3CoUOHCrwBiUSCW7duFbgdERERERUegz/RRNd2RERERFR4tA6F7du3R2BgoCFrISIiIiIj0ToUWltbo0qVKoashYiIiAqBRcpLY5dABVQY7xmHpCEiIvpA2NnZwdzCEpVuRBi7FNKBuYWlQcfmNWgoTEtLw/bt29G3b19DboaIiIi04ODggLDVfyMxMdHYpehdbGwsQkJCEBQUBGdnZ2OXYxB2dnZwcHAw2PoNEgofP36MtWvXIjw8HElJSQyFRERERYSDg4NBg4WxOTs7QyaTGbuMYkmrUNijRw80bNgw3+XOnj2L1atX48SJE8jKyoIgCDAz4xVqIiIioqJOq8Q2a9asXOcpFAps374da9euRXR0tDgEjbOzM3r16oUePXrop1IiIiIiMhidT+M9evRI7RKxIAiQSCTo0qULevfujWbNmumzTiIiIiIyoAKHwtOnTyMsLAwnT54ULxFXr14dqampkMvl+OWXXwxRJxEREREZkFahUKFQIDw8HGvXrkVMTAwEQYCFhQW++OIL9O3bF40aNcKgQYMgl8sNXS8RERERGYBWobBVq1ZITk6GIAhwc3NDr1694O3tjTJlyhi6PiIqJHFxcUhOTi6UbcXGxqp9LQxSqRSVK1cutO0RERU3WoXCpKQkWFlZYejQoRg0aBBsbW0NXRcRFaLExET4+fkhKyurULcbEhJSaNsyMTFBeHi4QQd+JSIqzrQKhR4eHoiMjMTvv/+O5cuX47PPPoOPjw8+/fRTQ9dHRIXAzs4OYWFhhXam0BikUikDIRFRHrQKhdu3b8f169exYcMG7N27F/v378eBAwfg6OgIHx8f9OrVy9B1EpGB8dIqEdGHzUTbBevWrYuffvoJJ0+exA8//AA3NzfExcVh0aJFaNu2La5evQoAyMzMNFStRERERGQgWodCFalUiq+++goRERHYuHEjunfvDnNzcygUCgiCgE8++QTTpk3DlStXDFEvERERERlAgUPhu+rVq4dZs2bh5MmT+N///gc3Nze8efMGmzZtQr9+/dCxY0f88ccf+qqViIiIiAzkvUKhilQqRf/+/bFz506sX78e3t7esLS0xMOHD7Fo0SJ9bIKIiIiIDEjnx9zlpkGDBmjQoAGCgoKwbds2bN68Wd+bICIiIiI908uZQk1KlSoFf39/7Ny501CbICIiIiI9MVgoJCIiIqLig6GQiIiIiBgKiYiIiIihkIiIiIjAUEhEREREYCgkIiIiIhhgnEIiIjIOi5SXxi6BCojvGRUlDIVERMWcnZ0dzC0sUelGhLFLIR2YW1jCzs7O2GUQMRQSERV3Dg4OCFv9NxITE41dit7FxsYiJCQEQUFBcHZ2NnY5BmFnZwcHBwdjl0HEUEhEVBI4ODiU6GDh7OwMmUxm7DKISjR2NCEiIiIihkIiIiIiYigkIiIiIjAUEhEREREYComIiIgIDIVEREREBIZCIiIiIgJDIRERERGBoZCIiIiIwFBIRERERGAoJCIiIiIwFBIRERERGAqJiIiICAyFRERERASGQiIiIiICQyERERERgaGQiIiIiMBQSERERERgKCQiIiIiMBQSERERERgKiYiIiAgMhUREREQEwMzYBeQmPj4eoaGhOHLkCF69eoVq1arB398fPj4++bZ9+/YtwsLCsHHjRjx58gTly5dHt27dMGrUKFhZWaktO3nyZISHh2tcz6xZs9CzZ0+97A8RERFRUVYkQ2FqaioGDx6Mu3fvol+/fqhevTr27t2LoKAgvHz5EiNHjsyz/YwZM7Bx40Z07NgR/v7+uHXrFpYsWYJ///0Xy5cvh0QiEZeNjIyEk5MTAgICcqynYcOGet83IiIioqKoSIbCNWvW4NatW5g3bx66desGAPD19cXQoUMRGhoKb29vODo6amx77do1bNy4Eb6+vpg5c6Y43dHREb/++iv27t2Lzp07AwCUSiXu3buHDh06wNvb2/A7RkRERFREFcl7Crdv344KFSqga9eu4jQTExMMGTIEmZmZ2LlzZ65tt23bBgAYOHCg2vSBAwfC3Nxc7VJxTEwMMjIyIJPJ9LsDRERERMVMkQuFSUlJuH//PurWrat2mRcA6tWrBwC4fv16ru2vXbuGUqVKwdXVVW26jY0N3Nzc1NpGRkYCANzc3AAACoUCb9++1ct+EBERERUnRS4UyuVyCIKg8fKwVCqFra0tHj9+nGv7Z8+e5Xpp2cHBAYmJiUhKSgLwf6Hw+PHjaN26NerXr4969eph9OjRiI2N1cPeEBERERUPRe6eQlVgs7Gx0Tjf2toaCoUiz/bOzs65tgWyO7KUKlUKUVFRAICrV69i9OjRsLe3x+XLlxEWFobLly9j8+bNcHJyyrNehUKBzMzMfPeLiIgKLi0tTfyamppq5GqoKOOxok6pVBa4TZELhYIg5Dv/v5eVC7puE5PsE6Rdu3ZF3bp1MXLkSFhYWAAA2rdvjwYNGiAgIAC//PILFi5cmOc67969q1MtRESUP9WVoZiYGP4BTnnisfL+ilwotLW1BYBczwYqFApUrVo1z/a5tVX9FVG6dGkAQPfu3TUu16FDBzg6OuLUqVP51uvm5gYzsyL3MhIRlQjm5uYAABcXF9SoUcPI1VBRxmNFnVKpLPCJqyKXZqpUqQKJRAK5XJ5jXlJSElJTU1GpUqU82z958kTjvGfPnqFMmTKwtLTMt45y5crh+fPn+S5nbW0tHohERKRfqgcOWFlZ5XpbERHAY+W/dDlbWuQ6mkilUri6uuLGjRs55l27dg1A3oNK16tXDwkJCTk6iqSkpODevXto0KABAODly5fo1q0bxo4dm2MdmZmZePjwYb73ExIRERGVFEUuFAKAl5cXnj59il27donTsrKysHLlSlhYWKBLly65tlUNdr18+XK16X/99RcyMzPFx9aVK1cOGRkZOHLkCG7fvq227JIlS5CUlIRevXrpa5eIiIiIirQid/kYAAYMGICIiAgEBgbi5s2bcHFxwZ49e3D27FlMnDgRFSpUAJA9pExUVBTc3d3h4eEBIPssYs+ePbFx40YkJiaiZcuWuH79OjZv3ozWrVujXbt2AACJRILp06dj2LBh8Pf3R79+/VCxYkWcO3cOBw4cQNOmTXMMgE1ERERUUhXJUGhlZYWwsDDMnz8fO3bsQEpKClxcXDB79my1ziEHDx5EaGgoxowZI4ZCAJg5cyacnZ2xdetWHD58GJUqVcKoUaMwYsQItZ7LzZs3x/r16/H7779j3bp1UCgUcHJywrfffoshQ4aIPZKJiIiISroiGQoBoGzZsggODs5zmYCAAAQEBOSYbmZmhlGjRmHUqFH5bqdOnTpYvHixznUSERERlQRF8p5CIiIiIipcDIVERERExFBIRERERAyFRERERASGQiIiIiICQyERERERgaGQiIiIiMBQSERERERgKCQiIiIiMBQSERERERgKiYiIiAgMhUREREQEhkIiIiIiAkMhEREREYGhkIiIiIjAUEhEREREYCgkIiIiIjAUEhEREREYComIiIgIDIVEREREBIZCIiIiIgJDIRERERGBoZCIiIiIwFBIRERERGAoJCIiIiIwFBIRERERADNjF0BEREQlV1xcHJKTkw2+ndjYWLWvhUEqlaJy5cqFtj1DYygkIiIig0hMTISfnx+ysrIKbZshISGFti0TExOEh4fDzs6u0LZpSAyFREREZBB2dnYICwsrlDOFxiCVSktMIAQYComIiMiAStLl1ZKOHU2IiIiIiKGQiIiIiBgKiYiIiAgMhUREREQEhkIiIiIiAkMhEREREYGhkIiIiIjAUEhEREREYCgkIiIiIvCJJkREVEBxcXGF9tiy2NhYta+FQSqV8ikc9EFiKCQiIq0lJibCz88PWVlZhbrdkJCQQtuWiYkJwsPDS9QzbYm0wVBIRERas7OzQ1hYWKGdKTQGqVTKQEgfJIZCIiIqEF5aJSqZ2NGEiIiIiBgKiYiIiIihkIiIiIjAUEhEREREYCgkIiIiIjAUEhEREREYComIiIgIDIVEREREBIZCIiIiIgJDIRERERGBoZCIiIiIwFBIRERERADMjF1AcSIIQo5pSqXSCJUQERER5U5TPtGUY97FUFgAb9++zTHt1q1bRqiEiIiIqGA05Zh38fIxERERETEUEhERERFDIREREREBkAj53XVIoqysLKSnp6tNMzU1hUQiMVJFRERERDkJgpDjHkJLS0uYmOR+PpChkIiIiIh4+ZiIiIiIGAoNatGiRXB3d8eQIUNyXebMmTNwd3fHokWLCrx+Pz8/uLu7G2WsxMePH8Pd3R1+fn6Fvm3Km+q40+ZfYGCgxnWcP38+z/lU/CUnJ6Nt27bw8PDAqVOnNC6TmpqKLl26oH79+rh7926u6+LPg5Ivr58rDRs2ROfOnTF79mwkJyfn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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.boxplot(x='learner', y='ate_diff', data=df_res_lasso2, linewidth=1, showfliers=False)\n",
    "plt.ylabel('ATE absolute diff')\n",
    "plt.xlabel('')\n",
    "plt.title('All experiments (Lasso)')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.6"
  },
  "orig_nbformat": 2
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
